
/**
 * Objetos desta classe utilizam métodos de busca para resolver problemas.
 * 
 * @author Marcos
 * @version V 1.0
 */

public class ResolvedorDeProblemas
{

    public ResolvedorDeProblemas()
    {
    }

    public boolean buscaCega(Problema problema, Lista fronteira)
    {
        Nodo nodo = problema.nodoInicial() ;
        if(problema.verificaObjetivo(nodo))
        {
            problema.apresentaSolucao(nodo) ; // pode ser substituido por objeto 
            return true ;
        }
        fronteira.inserir(nodo) ;
        Lista explorados = new Fila() ;
        Fila todosOsFilhos ;
        Nodo nodoFilho ;
        do
        {
            if(fronteira.vazia())
            {
                return false ;
            }
            nodo = fronteira.remover() ;
            explorados.inserir(nodo) ;
            todosOsFilhos = problema.gerarFilhos(nodo) ;
            while( !todosOsFilhos.vazia() )
            {
                nodoFilho = todosOsFilhos.remover() ;
                if( !fronteira.pesquisar(nodoFilho.getEstado()) && 
                    !explorados.pesquisar(nodoFilho.getEstado()))
                {
                    if(problema.verificaObjetivo(nodoFilho))
                    {
                        problema.apresentaSolucao(nodoFilho) ; // pode ser substituido por objeto 
                        return true ;
                    }
                    fronteira.inserir(nodoFilho) ;
                }
            }
        } while(true);
    }
}
